﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AirlineCommon;
using System.Data.SqlClient;
using System.Data;
using AirlineCommon.DAL;
namespace AirlineServiceFacade
{
    public class AirlineServices:IAirlineServices
    {
        
        #region IAirlineServices Members

        public Sector GetSectorDetail(string description)
        {
            Sector st = new Sector();
            return st.GetSectorDetail(description);
        }


        public List<Flight> GetFlightList(Sector sector)
        {
            Flight fl = new Flight();
            fl.Sector = sector;
            return fl.GetFlightList();
        }

        public PassengerCommon CreatePassenger(AirlineFactory factory)
        {
            return factory.CreatePassenger();
        }

        public TravelClass CreateTravelClass(AirlineFactory factory)
        {
            return factory.CreateTravelClass();
        }

        public string GeneratePNRNo()
        {
            Ticket tk = new Ticket();
            return tk.GeneratePNRno();
        }

        /*Chức năng: passenger.InsertPassenger(trans)
            + Chèn thông tin khách hàng vào bảng Passengers trong đó có Passengers.Status="Confimed"
         Chức năng: ticket.InsertDaillyCollection(trans)
            + Chèn thông tin vào bảng Dailycollections với TranType="Collection"
         Chức năng travel.UpdateClassSeatForReservation(trans, flight.FlightNo, flight.FlightDate)
            + Hoặc Cập nhật ScheduledFlights.FirstClassSeatsAvailable -1
            + Hoặc Cập nhật ScheduledFlights.BusinessClassSeatsAvailable -1
            + Hoặc Cập nhật ScheduledFlights.EconomyClassSeatsAvailable -1*/

        public bool ReserTicket(PassengerCommon passenger, Ticket ticket, TravelClass travel,Flight flight)
        {
            SqlConnection conn = new SqlConnection(DatabaseProvider.AirlineConnectionString);
            if (conn.State == ConnectionState.Closed)
                conn.Open();
            SqlTransaction trans = conn.BeginTransaction();
            try
            {
                if (passenger.InsertPassenger(trans) == 1 && ticket.InsertDaillyCollection(trans) == 1 &&
                    travel.UpdateClassSeatForReservation(trans, flight.FlightNo, flight.FlightDate) == 1)
                {
                    trans.Commit();
                    return true;
                }
                else
                {
                    trans.Rollback();
                    return false;
                }
            }

            catch
            {
                trans.Rollback();
                return false;
            }
            finally
            {
                if (conn.State == ConnectionState.Open)
                    conn.Close();
            }
        }

        /*-Nếu khách hàng là ‘First’ or ‘Business’
            + Cập nhật ScheduledFlights.FirstClassSeatsAvailable +1
            + Hoặc cập nhật ScheduledFlights.BusinessClassSeatsAvailable+1
            + Cập nhật Passengers.Status=”Cancelled” có PNRNo hủy của khách hàng đó
            + Chèn thông tin vào bảng DailyCollections theo PNRNo tương ứng của khách hàng hủy đó với TranType=’Refund’
        -Nếu khách hàng là ‘Economy’
            +Tìm PNRNo khách hàng đầu tiên có Status=’OverBook’
            +Nếu không có khách hàng nào chờ thì:
                a. Hoặc cập nhật ScheduledFlights.EconomyClassSeatsAvailable+1
                b. Cập nhật Passengers. Status=”Cancelled” cho khách hàng hủy có PNR đó
                c. Chèn thông tin vào bảng DailyCollections cho PNRNo hủy tương ứng với TranType=’Refund’
            +Nếu có khách hàng nào chờ thì:
                a.	Cập nhật Passengers. Status=”Confirmed” cho khách hàng có PNR trong hàng đợi đó
                b.	Cập nhật Passengers. Status=”Cancelled” cho khách có PNR hủy
                c.	Chèn thông tin vào bảng DailyCollections cho PNRNo hủy tương ứng với TranType=’Refund’
        */

        public bool CancelReservation(PassengerCommon passenger, float amountPaid,TravelClass travelClass)
        {
            SqlConnection conn = new SqlConnection(DatabaseProvider.AirlineConnectionString);
            if (conn.State == ConnectionState.Closed)
                conn.Open();
            SqlTransaction trans = conn.BeginTransaction();
            try
            {
                Ticket ticket = new Ticket();
                ticket.PNRNo = passenger.PNRNo;
                ticket.TranDate = DateTime.Now;
                ticket.TranType = "Refund";
                ticket.Amount = travelClass.CalculateRefundAmt(amountPaid, passenger.Status, passenger.TravelDate);
                if (passenger is EconomyPassenger)
                {
                    //Lấy PNRNo của khách hàng chờ đầu tiên có status="OverBook"
                    string PNROver = ((EconomyClass)travelClass).GetPNRPassengerOverBook(passenger.FlightNo, passenger.TravelDate);
                    if (PNROver == string.Empty)
                    {
                        if (travelClass.UpdateClassSeatForCancellation(trans, passenger.FlightNo, passenger.TravelDate) == 1 &&
                            passenger.UpdatePassengerStatus(trans, passenger.PNRNo, "Cancelled") == 1 &&
                            ticket.InsertDaillyCollection(trans) == 1)
                        {
                            trans.Commit();
                            return true;
                        }
                        else
                        {
                            trans.Rollback();
                            return false;
                        }

                    }
                    else
                    {
                        if (passenger.UpdatePassengerStatus(trans, passenger.PNRNo, "Cancelled") == 1 &&
                            passenger.UpdatePassengerStatus(trans, PNROver, "Confirmed") == 1 &&
                            ticket.InsertDaillyCollection(trans) == 1)
                        {
                            trans.Commit();
                            return true;
                        }
                        else
                        {
                            trans.Rollback();
                            return false;
                        }
                    }
                }
                else
                {
                    if (travelClass.UpdateClassSeatForCancellation(trans, passenger.FlightNo, passenger.TravelDate) == 1 &&
                           passenger.UpdatePassengerStatus(trans, passenger.PNRNo, "Cancelled") == 1 &&
                           ticket.InsertDaillyCollection(trans) == 1)
                    {
                        trans.Commit();
                        return true;
                    }
                    else
                    {
                        trans.Rollback();
                        return false;
                    }
                }
               
            }
            catch
            {
                trans.Rollback();
                return false;
            }
            finally
            {
                if (conn.State == ConnectionState.Open)
                    conn.Close();
            }
        }


        public string GetPassengerClassByPNRNo(string PNRNo)
        {
            Ticket ticket = new Ticket();
            return ticket.GetPassengerClassByPNRNo(PNRNo);
        }

      

        public float GetFareAmount(string PNRNo)
        {
            Ticket ticket = new Ticket();
            return ticket.GetFareAmount(PNRNo);
        }

        public float GetRefundAmount(string PNRNo)
        {
            Ticket ticket = new Ticket();
            return ticket.GetRefundAmount(PNRNo);
        }

     
        public DataSet GetScheduleFlightList()
        {
            Flight fl = new Flight();
            return fl.GetScheduleFlightList();
        }

        #endregion
    }
}
